<!DOCTYPE html>
<html>
<head>
	<meta charset="utf-8">
	<meta name="viewport" content="width=device-width, initial-scale=1">
	<title></title>
</head>
<body>

	<script type="text/javascript">
		
		/*
			原型:当我们创建一个函数,都会有一个prototype属性,这个属性叫做原型对象,其中包含所有实例对象的共享的属性和方法

			prototype:显示原型  所有函数对象
			__proto__:隐式原型 所有对象都有

			函数是可以被调用的对象(万物皆可对象),所以有prototype和__proto__两个
			
			__proto__指向的是父元素的protoType

			__proto__的作用:当你访问一个对象的属性或者方法的时候,如果这个对象中不存在这个属性,那么就会去__proto__所指向的那个对象(父元素的protType)里去找,如果父元素也不存在这个属性则继续往上找,直到最顶端null,这就是原型链

		*/
		//let arr = new Array()
		let arr1 = [1,2,3,4]
		let arr2 = [4,5,6]
		Array.prototype.sun = function() {
			return this
		}
		Array.prototype.head = '孙悟空'
		Object.prototype.head = '白骨精'
		console.log(arr1.prototype,arr1.__proto__,Array.prototype)

		console.log(arr1.sun()) //[1, 2, 3, 4]
		console.log(arr2.head) //


		// 构造函数里的this指向的是实例化出来的对象
		function Box(width,height) {
			//私有
			this.width = width
			this.height = height
			this.c = function() {
				return (this.width + this.height) * 2
			}
		}

		//通过原型添加共享属性和方法 公共

		Box.prototype.name = '盒模型'
		Box.prototype.s = function() {
			return this.height * this.width
		}

		let box1 = new Box(100,200)
		let box2 = new Box(200,200)

		console.log(box1.s())
		console.log(box2.s())
		//拿的同一个s 原型的好处是 不会有额外的内存，所有属性和方法都是从原型继承下来的
		console.log(box1.s == box2.s) //true
		//c是私有的每次去实例化的时候(new)的时候也不一样 都会重新创建，所以每个c的存储地址
		console.log(box1.c == box2.c) //false
		//对象的__proto__指向父级的prototype
		console.log(box1.__proto__ == Box.prototype) //true


	</script>	

</body>
</html>